package de.fhin.mas.agents.searcher.behaviours;

import jade.core.Agent;
import jade.domain.FIPANames;
import jade.domain.FIPAAgentManagement.FailureException;
import jade.domain.FIPAAgentManagement.NotUnderstoodException;
import jade.domain.FIPAAgentManagement.RefuseException;
import jade.lang.acl.ACLMessage;
import jade.proto.AchieveREResponder;
import de.fhin.mas.MASEvents;
import de.fhin.mas.agents.searcher.SearcherAgent;
import de.fhin.mas.util.MessageUtil;

/**
 * Dieses <tt>Behaviour</tt> behandelt alle eingehenden Anfragen, den
 * derzeitigen Auftrag abzubrechen und eine bestimmte Position anzufahren gemäß
 * dem FIPA Request Protokoll.
 * 
 * @author Alexander Weickmann
 */
public class AbortAndGotoRequestResponder extends AchieveREResponder {

	/** Die eindeutige ID zur Serialisierung ueber das Netzwerk. */
	private static final long serialVersionUID = 3711505679363055152L;

	/**
	 * Erzeugt einen <tt>AbortAndGotoRequestResponder</tt>.
	 * 
	 * @param a
	 *            Der Agent, zu dem das <tt>Behaviour</tt> gehört.
	 */
	public AbortAndGotoRequestResponder(Agent a) {
		super(a, MessageUtil.buildBasicCommunicationTemplate(
				FIPANames.InteractionProtocol.FIPA_REQUEST,
				MASEvents.ABORT_AND_GO_TO.getName(), ACLMessage.REQUEST, null));
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected ACLMessage prepareResponse(ACLMessage request)
			throws NotUnderstoodException, RefuseException {

		ACLMessage agree = request.createReply();
		agree.setPerformative(ACLMessage.AGREE);

		return agree;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected ACLMessage prepareResultNotification(ACLMessage request,
			ACLMessage response) throws FailureException {

		((SearcherAgent) myAgent).cancelTargetSearch();

		ACLMessage done = request.createReply();
		done.setPerformative(ACLMessage.INFORM);
		done.setContent("done");

		return done;
	}

}
